# 一、使用装饰器来为斐波那契函数添加缓存
def cache_deco(func):
    cache = {}

    def wrapper(*args, **kwargs):
        res = cache.get(args[0])
        if res is None:
            res = func(*args, **kwargs)
            cache[args[0]] = res
        return res

    return wrapper


@cache_deco
def fib_with_recursion(n):
    if n in (0, 1):
        return n
    return fib_with_recursion(n - 1) + fib_with_recursion(n - 2)


def test_generator():
    for item in [1, 2, 3, 4, 5]:
        yield item
        print('test')


if __name__ == '__main__':
    for i in range(20):
        print(fib_with_recursion(i), end=' ')
    #  递归本身效率较低，使用装饰器添加缓存后程序效率提升
    print(f'\nF(100)={fib_with_recursion(100)}')

    # 二、默写迭代器和生成器的概念
    '''
    迭代器：一个未知长度的数据流，使用 next() 函数获取下一个元素
    生成器：一种特殊的迭代器，提供了惰性延迟的功能，在函数中使用 yield 关键字创建生成器
    '''
    # 迭代器
    iter1 = iter([1, 2, 3, 4, 5])
    while True:
        try:
            print(next(iter1), end=' ')
        except StopIteration:
            break
    print()
    # 生成器
    g = test_generator()
    while True:
        try:
            print(next(g), end=' ')
        except StopIteration:
            break
